package com.rickpan.service;

import com.rickpan.entity.ProjectTask;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Optional;

/**
 * 项目任务服务接口
 * 
 * @author RickPan Team
 * @since 2024-01-15
 */
public interface ProjectTaskService {

    /**
     * 创建任务
     */
    ProjectTask createTask(ProjectTask task);

    /**
     * 更新任务
     */
    ProjectTask updateTask(ProjectTask task);

    /**
     * 删除任务
     */
    void deleteTask(Long taskId);

    /**
     * 根据ID查找任务
     */
    Optional<ProjectTask> findById(Long taskId);

    /**
     * 根据项目ID查找任务列表
     */
    List<ProjectTask> findTasksByProject(Long projectId);

    /**
     * 根据项目ID查找任务列表（分页）
     */
    Page<ProjectTask> findTasksByProject(Long projectId, Pageable pageable);

    /**
     * 根据项目ID和状态查找任务列表
     */
    List<ProjectTask> findTasksByProjectAndStatus(Long projectId, ProjectTask.Status status);

    /**
     * 根据项目ID和状态查找任务列表（分页）
     */
    Page<ProjectTask> findTasksByProjectAndStatus(Long projectId, ProjectTask.Status status, Pageable pageable);

    /**
     * 根据分配者ID查找任务列表
     */
    List<ProjectTask> findTasksByAssignee(Long assigneeId);

    /**
     * 根据分配者ID和状态查找任务列表
     */
    List<ProjectTask> findTasksByAssigneeAndStatus(Long assigneeId, ProjectTask.Status status);

    /**
     * 根据创建者ID查找任务列表
     */
    List<ProjectTask> findTasksByCreator(Long creatorId);

    /**
     * 搜索任务
     */
    List<ProjectTask> searchTasks(Long projectId, String keyword);

    /**
     * 搜索任务（分页）
     */
    Page<ProjectTask> searchTasks(Long projectId, String keyword, Pageable pageable);

    /**
     * 查找即将到期的任务
     */
    List<ProjectTask> findTasksDueSoon(int days);

    /**
     * 查找逾期任务
     */
    List<ProjectTask> findOverdueTasks();

    /**
     * 根据项目ID查找逾期任务
     */
    List<ProjectTask> findOverdueTasksByProject(Long projectId);

    /**
     * 根据分配者ID查找逾期任务
     */
    List<ProjectTask> findOverdueTasksByAssignee(Long assigneeId);

    /**
     * 更新任务状态
     */
    void updateTaskStatus(Long taskId, ProjectTask.Status status);

    /**
     * 分配任务
     */
    void assignTask(Long taskId, Long assigneeId);

    /**
     * 获取任务统计信息
     */
    TaskStatistics getTaskStatistics(Long projectId);

    /**
     * 获取用户任务统计信息
     */
    TaskStatistics getUserTaskStatistics(Long userId);

    /**
     * 检查用户是否有任务管理权限
     */
    boolean hasTaskManagePermission(Long taskId, Long userId);

    /**
     * 检查用户是否有任务查看权限
     */
    boolean hasTaskViewPermission(Long taskId, Long userId);

    /**
     * 任务统计信息类
     */
    class TaskStatistics {
        private long totalTasks;
        private long todoTasks;
        private long inProgressTasks;
        private long completedTasks;
        private long overdueTasks;

        // 构造函数
        public TaskStatistics() {}

        public TaskStatistics(long totalTasks, long todoTasks, long inProgressTasks, 
                            long completedTasks, long overdueTasks) {
            this.totalTasks = totalTasks;
            this.todoTasks = todoTasks;
            this.inProgressTasks = inProgressTasks;
            this.completedTasks = completedTasks;
            this.overdueTasks = overdueTasks;
        }

        // Getter 和 Setter
        public long getTotalTasks() { return totalTasks; }
        public void setTotalTasks(long totalTasks) { this.totalTasks = totalTasks; }

        public long getTodoTasks() { return todoTasks; }
        public void setTodoTasks(long todoTasks) { this.todoTasks = todoTasks; }

        public long getInProgressTasks() { return inProgressTasks; }
        public void setInProgressTasks(long inProgressTasks) { this.inProgressTasks = inProgressTasks; }

        public long getCompletedTasks() { return completedTasks; }
        public void setCompletedTasks(long completedTasks) { this.completedTasks = completedTasks; }

        public long getOverdueTasks() { return overdueTasks; }
        public void setOverdueTasks(long overdueTasks) { this.overdueTasks = overdueTasks; }
    }
}
